{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## I. Stack\n",
    "----\n",
    "\n",
    "Xem thêm về [Stack](https://www.tutorialspoint.com/python/python_stack.htm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Stack](https://lh3.googleusercontent.com/dqVcwfZWkFojn424DQq9wAYfEgvx9I7iaF1b2KR9esqwSAVTvAOD6oLLVEZ_kKdK0KX4KjuIK13BUUDWFIhd-0A5Y8Y3XmbRM-yrt3T_96vOaLhfmortauZYU7KutzwYrG9SIMSkKx70jSOzTJP4scmn5FdasUqd8iEPikCadxwct3Bh61bF_PdCFu_2ARw9HzUl54WqH45vHFtDDO87UZI4L7w4Dy9I12plH1-AAdPJTgX_oSNEcMLqMCUtVDW_R0AW0wq8-urS0wuncvUhmjAuFwElAbBHZqwUEgvVP84b7mAm1hNXzbQEjViHRPQbZdNOMrqeLzWX7zVFSJdayi5SS6y_Djksm_UB83LIjZDpOoKqR52C_h_cVxeHJiWHMY-yz2R6bg8O5Z-2nOmVvjLveeqiVmCS2FXZ9HzIajcgRrj3BCf2hwgP7Zq2REaNyc8K7w2c4asn6beIksrXT7sNClvYWSPP1trEsIB4lo9SxEtiGCle2Gec6nEcfJuanpjf7z781tI7h7jxUZ0Uco6hwGGAGFUNiypKoyHpwwLeDioexBiscdo6qDBS6X6qZY43ktQhRMoprZdq_8-DpIGmigpClt03cjktRZ8CmoZGCWMWxHINtOmoXJxe6OppuIpGl0XmkhRZNSvpKaUVxIiMhRcjASujSw=w430-h515-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Stack trong Tiếng Việt có thể dịch ra là ngăn xếp, bạn có thể liên tưởng đến chồng đĩa CD trong nhà mình. Ngăn xếp có đặc điểm điển hình mang tên **LIFO(Last In First Out)** - chiếc CD đặt cuối cùng nằm trên cùng thì có thể lấy ra đầu tiên và ngược lại - chiếc CD được đặt vào đầu tiên nằm dưới đáy chỉ có thể lấy ra cuối cùng."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Khởi tạo một Stack"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Khởi tạo một Stack với một biến thực thể là một List rỗng\n",
    "class Stack:\n",
    "    def __init__(self):\n",
    "        self.stack = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "stack1 = Stack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stack1.stack"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Push và Pop"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![stack](https://www.tutorialspoint.com/data_structures_algorithms/images/stack_representation.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**PUSH** là hành động thêm một phần tử lên trên cùng ngăn xếp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**POP** là lấy đi một phần tử trên cùng của ngăn xếp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Stack:\n",
    "    def __init__(self):\n",
    "        self.stack = []\n",
    "    # Thêm(Push) một phần tử lên trên cùng ngăn xếp\n",
    "    def push(self, elem):\n",
    "        self.stack.append(elem)\n",
    "    # Pop(Xóa) đi phần tử trên cùng ngăn xếp\n",
    "    def pop(self):\n",
    "        if len(self.stack) > 0:\n",
    "            self.stack.pop()\n",
    "        else:\n",
    "            print \"Stack is Empty\"\n",
    "    # In tất cả các phần tử trong Stack\n",
    "    def printAllElems(self):\n",
    "        if len(self.stack) > 0:\n",
    "            for elem in self.stack:\n",
    "                print elem\n",
    "        else:\n",
    "            print \"Stack is Empty\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "stack2 = Stack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stack is Empty\n"
     ]
    }
   ],
   "source": [
    "stack2.printAllElems()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Thêm phần tử 3 lên trên cùng của ngăn xếp\n",
    "stack2.push(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n"
     ]
    }
   ],
   "source": [
    "stack2.printAllElems()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Xóa đi phần tử trên cùng của ngăn xếp\n",
    "stack2.pop()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stack is Empty\n"
     ]
    }
   ],
   "source": [
    "stack2.printAllElems()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
